package J3_13;

public class test {

    //给你两个整数数组 startTime（开始时间）和 endTime（结束时间），并指定一个整数 queryTime 作为查询时间。
    //
    //已知，第 i 名学生在 startTime[i] 时开始写作业并于 endTime[i] 时完成作业。
    //
    //请返回在查询时间 queryTime 时正在做作业的学生人数。形式上，返回能够使 queryTime 处于区间 [startTime[i], endTime[i]]（含）的学生人数。

    public int busyStudent(int[] startTime, int[] endTime, int queryTime) {
        int n = startTime.length;
        int num = 0;
        for (int i = 0; i < n; i++) {
            if (queryTime >= startTime[i] && queryTime <= endTime[i]) {
                num++;
            }
        }
        return num;
    }


    //给你两个长度可能不等的整数数组 nums1 和 nums2 。两个数组中的所有值都在 1 到 6 之间（包含 1 和 6）。
    //
    //每次操作中，你可以选择 任意 数组中的任意一个整数，将它变成 1 到 6 之间 任意 的值（包含 1 和 6）。
    //
    //请你返回使 nums1 中所有数的和与 nums2 中所有数的和相等的最少操作次数。如果无法使两个数组的和相等，请返回 -1 。

    public int minOperations(int[] nums1, int[] nums2) {
        int len1 = nums1.length;
        int len2 = nums2.length;
        if (len1 > len2 * 6 || len1 * 6 < len2) {
            return -1;
        }
        int[] cnt1 = new int[7];
        int[] cnt2 = new int[7];
        int diff = 0;
        for (int i : nums1) {
            cnt1[i]++;
            diff += i;
        }
        for (int i : nums2) {
            cnt2[i]++;
            diff -= i;
        }
        if (diff == 0){
            return 0;
        }else if (diff > 0){
            return help(cnt1,cnt2,diff);
        }else {
            return help(cnt2,cnt1,-diff);
        }
    }

    public int help (int[] n1, int[] n2, int diff) {
        int[] h = new int[7];
        for (int i = 1; i < 6; i++) {
            h[i] += n1[i+1];
            h[6-i] += n2[i];
        }
        int res = 0;
        for (int i = 5; i > 0 && diff > 0; i--) {
            int t = Math.min(((diff + i - 1)/i),h[i]);
            res += t;
            diff -= t * i;
        }
        return res;
    }
}
